#include <iostream>
#include <memory> //智能指针：能自动管理堆上对象的指针

// template<typename T>
// class Pointer
// {
// public:
//     Pointer(T* p) : p(p)
//     {

//     }

//     ~Pointer()
//     {
//         delete p;
//     }
// private:
//     T *p;

// };

class Test
{
public:
    Test()
    {
        std::cout << "构造函数!\n";
    }
    ~Test()
    {
        std::cout << "析构函数!\n";
    }
    void show()
    {
        std::cout << " show!\n";
    }
};

int main()
{

    // 独占指针  unique_ptr
    // 一块堆上内存只能有一个指针进行管理
    // 不允许拿裸指针，更不能释放裸指针
    // 不允许裸指针和智能指针混用
    // std::unique_ptr<Test> ptr = std::make_unique<Test>();
    // ptr->show();
    // std::unique_ptr<Test> p2 = ptr;


    // 共享指针  shared_ptr
    // std::shared_ptr<Test> p1 = std::make_shared<Test>();
    // // 引用计数器: 标志着还有几个指针指向这块内存
    // std::cout << p1.use_count() << std::endl;
    // std::shared_ptr<Test> p2 = p1;
    // std::cout << p1.use_count() << std::endl;

    // Test *t = new Test;
    // std::shared_ptr<Test> p1(t);
    // std::cout << p1.use_count() << std::endl;
    // std::shared_ptr<Test> p2(t);
    // std::cout << p2.use_count() << std::endl;


    // 弱指针 weak_ptr
    
    return 0;
}